
#ifndef REGISTRO_H_
#define REGISTRO_H_

#include <string>
#include <cstring>
#include <vector>

/*
 *  Registro de longitud variable
 *  El ID solo puede ser de tipo entero
 */
class Registro
{
private:
	int clave;
	std::vector<unsigned char> bytes;
	unsigned char* posEnRegistro;  // apunta al siguente del último byte leido

public:

	Registro(int clave);
	virtual ~Registro();

	/**
	 * Retorna la clave del registro.
	 */
	int getId();

	/**
	 * Retorna la longitud del registro.
	 */
	int getLongitud();

	/**
	 * Compara el registro y ve si es igual.
	 */
	bool equals(Registro* registro);

	/**
	 * Copia el registro pasado por parametro.
	 */
	void clonar(Registro* registro);

	/*
	 *Obtiene la representacion del registro en un char*.
	 */
	char* getComoArrayDeBytes();

	/**
	 * Obtiene el registro a partir de un array de bytes.
	 */
	void hidratar(char* registro, int longitud);

protected:
	void operator<<(const char);
	void operator<<(const std::string);
	void operator<<(const int);

	void operator>>(char&);
	void operator>>(std::string&);
	void operator>>(int&);

private:
	void do_serializar();
	void do_deserializar();
	virtual void serializar();    // estos dos metodos deben ser definidos en cada tipo
	virtual void deserializar();  // de registro particular
};

#endif /* REGISTRO_H_ */
